package Logic

import (
	"crypto/md5"
	"encoding/hex"
	"errors"
	"fmt"
	"github.com/gin-gonic/gin"
	"server/logutil"
	"server/model"
	"server/response"
	"server/servers"
)

// VerifyPassword 实现判断用户名密码是否存在/匹配
func VerifyPassword(ctx *gin.Context, acc string, pas string) (bool, model.User) {
	if acc == "" || pas == "" {
		fmt.Println("账号或密码为空")
		return false, model.User{}
	}
	//根据该账号拿到密码
	user, err, number := servers.Svc.UserModel.SelectByAccount(acc)
	if number == 0 {
		fmt.Println("该账户不存在！")
		response.Fail(ctx, nil, "该账户不存在")
		logutil.LogError(errors.New("该账户不存在"))
	}
	if err != nil {
		logutil.LogError(err)
		response.Fail(ctx, nil, "查找该账号出现问题")
		fmt.Println("查找该账号出现问题")
		return false, model.User{}
	}
	//使用md5加密法
	hasher := md5.New()
	hasher.Write([]byte(pas))
	hashedPassword := hasher.Sum(nil)
	pas = hex.EncodeToString(hashedPassword)

	if user.Password != pas {
		response.Fail(ctx, nil, "账号或密码不正确")
		fmt.Println("账号或密码不正确")
		return false, model.User{}
	}
	return true, user
}

// JudgeAccount 实现判断账号是否存在
func JudgeAccount(acc string) bool {
	_, _, count := servers.Svc.UserModel.SelectByAccount(acc)
	if count == 0 {
		return false
	}
	return true
}

// CreatAccount 实现创建新用户
func CreatAccount(ctx *gin.Context, acc string, pas string) {

	var user = model.User{
		Account:  acc,
		Password: pas,
	}
	//使用insert方法
	err := servers.Svc.UserModel.Insert(user)
	if err != nil {
		logutil.LogError(err)
		response.Fail(ctx, nil, err.Error())
		fmt.Println("增加账号时出现错误")
	}
	err = InitResourceByUser(ctx, servers.Svc.UserModel.GetId(acc))
	if err != nil {
		logutil.LogError(err)
		response.Fail(ctx, nil, err.Error())
		fmt.Println("初始化资源出现问题")
	}

	err = InitUserDiamondLogic(ctx, servers.Svc.UserModel.GetId(acc))
	if err != nil {
		logutil.LogError(err)
		response.Fail(ctx, nil, err.Error())
		fmt.Println("初始化方块出现问题")
	}

	user, err, _ = servers.Svc.UserModel.SelectByAccount(acc)
	response.Success(ctx, gin.H{"user": user}, "注册成功")

}

// UpdateInfo 更新用户的姓名性别信息
func UpdateInfo(acc string, name string, sex int) error {

	err := servers.Svc.UserModel.UpdateNameAndSex(acc, name, sex)
	return err
}
